闪电网络实操,从最简单的比特币第二层闪电网络付款开始
来源 | Hackernoon
编译 | 火火酱
责编 | Carol
出品 | 区块链大本营(blockchain_camp)
好久不见的实操演练,又来了!
在本文中,我们将用测试网作为示范,利用比特币第二层闪电网络进行付款。
我们将会使用命令行工具,因为我发现这是使用网络的最可靠的方法,同时也可以让你对网络的运行方式有更加深入的了解。
俗话说,磨刀不误砍柴工。为了能够完成今天的实操,你需要提前安装好以下环境。
正在运行bitcoind和lightningd,并且已与testnet区块链同步。 已安装blockstream的c-lightning cli工具lightning-cli,并且可以访问其$PATH。
交易 ID 链接:
https://testnet.blockchain.info/
你需要等待6次确认——大约需要1个小时,资金才会显示在你的钱包中。
$ lightning-cli listfunds
{
"outputs": [{
"txid": "d30ad72742d5c05343f65a1f78a90191f7b13341ed309cad0297a4e2fd3f0196",
"output": 1,
"value": 64849668,
"status": "confirmed"
}]
}
连接到对等方并且建立支付通道
第1层BTC交易=1。等待时间= 60分钟。
要想在网络上进行付款,需要先连接到网络中。如何能够找到另一个要连接的节点呢?前往Acinq的闪电网络浏览器。
搜索连接状态良好的对等点(有很多通道的对等点),然后复制其URI。最初,我在连接到几个节点的过程中超时了,但只要继续尝试,总能找到一个可以立即进行连接的节点。
$ lightning-cli connect 03e5f9d1935c67a029bf0a26af5f63109f4f4c45993a8f45177a8f2f39bcb46144 77.58.162.148 9735
$ lightning-cli list peers
{
"state": "GOSSIPING",
"id": "03e5f9d1935c67a029bf0a26af5f63109f4f4c45993a8f45177a8f2f39bcb46144",
"alias": "IslandDSP",
"netaddr": ["84.246.200.122:9735"],
"connected": true
}
现在,我们可以与刚刚连接到的对等节点建立支付通道。打开和关闭通道都需要与主区块链进行交互,因此我们要为其提供足够的资金(以millisatoshis为单位),以便将其用于多次付款。
$ lightning-cli fundchannel 03e5f9d1935c67a029bf0a26af5f63109f4f4c45993a8f45177a8f2f39bcb46144 50000
$ lightning-cli listpeers
{
"id": "03e5f9d1935c67a029bf0a26af5f63109f4f4c45993a8f45177a8f2f39bcb46144",
"connected": true,
"netaddr": ["84.246.200.122:9735"],
"alias": "IslandDSP",
"color": "68f442",
"channels": [{
"state": "CHANNELD_AWAITING_LOCKIN",
"owner": "lightning_channeld",
"channel_id": "958b3bd04adb40fd8ff0700a0b24e0298a2ac265273c08ed0218af38140ba678",
"funding_txid": "78a60b1438af1802ed083c2765c22a8a29e0240b0a70f08ffd40db4ad03b8b95",
"msatoshi_to_us": 500000000,
"msatoshi_total": 500000000,
"dust_limit_satoshis": 546,
"max_htlc_value_in_flight_msat": 18446744073709552000,
"channel_reserve_satoshis": 0,
"htlc_minimum_msat": 0,
"their_to_self_delay": 6,
"our_to_self_delay": 144,
"to_self_delay": 6,
"max_accepted_htlcs": 483,
"status": ["CHANNELD_AWAITING_LOCKIN:Funding needs more confirmations."],
同样,在比特币测试网浏览器中搜索txid,并等待3-6次确认,然后该通道将会被视为已开放。这时,你应该看到状态更改为CHANNELD_NORMAL。
$ lightning-cli listpeers
{
"peers": [{
"id": "03e5f9d1935c67a029bf0a26af5f63109f4f4c45993a8f45177a8f2f39bcb46144",
"connected": true,
"netaddr": ["84.246.200.122:9735"],
"alias": "IslandDSP",
"color": "3399ff",
"channels": [{
"state": "CHANNELD_NORMAL",
"owner": "lightning_channeld",
"short_channel_id": "1289768:416:0",
"channel_id": "ba95c71228ce3f57e25f6ac9c4a7418a52a056435b2276dd47437c7521ebda8e",
"funding_txid": "8edaeb21757c4347dd76225b4356a0528a41a7c4c96a5fe2573fce2812c795ba",
"msatoshi_to_us": 100000000,
"msatoshi_total": 100000000,
"dust_limit_satoshis": 546,
"max_htlc_value_in_flight_msat": 18446744073709552000,
"channel_reserve_satoshis": 0,
"htlc_minimum_msat": 0,
"their_to_self_delay": 6,
"our_to_self_delay": 144,
"to_self_delay": 6,
"max_accepted_htlcs": 483,
"status": ["CHANNELD_NORMAL:Funding transaction locked. Channel announced."],
"in_payments_offered": 0,
"in_msatoshi_offered": 0,
"in_payments_fulfilled": 0,
"in_msatoshi_fulfilled": 0,
"out_payments_offered": 0,
"out_msatoshi_offered": 0,
"out_payments_fulfilled": 0,
"out_msatoshi_fulfilled": 0
}]
}]
}
生成付款请求
$ lightning-cli decodepay lntb1500n1pdvp7t9pp5k5mvp8u045pdnumnt89cdc7l90lpvff7sjzkrvawg93ju3mgg3nsdp62fjkzepqg9e8g6trd3jn5gzfyp9kummhyptksmeq2dshgmmndp5jqjtnp5cqzyskw8lzg7w4hcfyhncczcaexlpx3tdefm0vjnh9dkqev23g94tdta8jjqzp87v6r9q8xwe3mnjf0tryaa7zkxxj4gwgfcqea32j0x069qqsjyjhz
{
"currency": "tb",
"timestamp": 1522596197,
"created_at": 1522596197,
"expiry": 3600,
"payee": "039cc950286a8fa99218283d1adc2456e0d5e81be558da77dd6e85ba9a1fff5ad3",
"msatoshi": 150000,
"description": "Read Article: I Know Who Satoshi Is\r",
"min_final_cltv_expiry": 144,
"payment_hash": "b536c09f8fad02d9f37359cb86e3df2bfe16253e848561b3ae41632e47684467",
"signature": "3045022100b38ff123ceadf0925e78c0b1dc9be13456dca76f64a772b6c0cb151416ab6afa022079480209fccd0ca0399d98ee724bd63277be158c69550e42700cf62a93ccfd14"
}
进行支付
第2层 BTC 交易= 1 等待时间 = 毫秒。
现在我们已经准备好进行第二次比特币交易了,第一次比特币交易已经建立了闪电网络,因此第二次交易应该立即就能得到确认。
$ lightning-cli pay lntb1500n1pdvp7t9pp5k5mvp8u045pdnumnt89cdc7l90lpvff7sjzkrvawg93ju3mgg3nsdp62fjkzepqg9e8g6trd3jn5gzfyp9kummhyptksmeq2dshgmmndp5jqjtnp5cqzyskw8lzg7w4hcfyhncczcaexlpx3tdefm0vjnh9dkqev23g94tdta8jjqzp87v6r9q8xwe3mnjf0tryaa7zkxxj4gwgfcqea32j0x069qqsjyjhz
{
"code": 206,
"message": "Fee 1100 is 0.733333% of payment 150000; max fee requested is 0.500000%",
"data": {
"fee": 1100,
"feepercent": 0.733333,
"msatoshi": 150000,
"maxfeepercent": 0.500000,
"getroute_tries": 6,
"sendpay_tries": 0,
"failures": []
}
}
回到Y’alls,然后点击“check for payment检查付款”以显示该文章。但不幸的是,这一步我没成功。我回去检查命令行的时候才发现我确实没付款。
$ lightning-cli listpayments
{ "payments": [] }
为了解决这个问题,我尝试用Y’alls直接创建一个支付通道。
$ lightning-cli connect 039cc950286a8fa99218283d1adc2456e0d5e81be558da77dd6e85ba9a1fff5ad3 34.200.252.146
$ lightning-cli fundchannel 039cc950286a8fa99218283d1adc2456e0d5e81be558da77dd6e85ba9a1fff5ad3 500000
{
"code": -1,
"message": "received ERROR channel 3795216ba4a257a1f36f1062af58b4513ad82dac90d298e45ca83271e67cf1d6: Unacceptable channel constraints: minimum HTLC value is too large: 0"
}
显然,这是lnd的一个bug,Y’alls必须用做他们的闪电后台驻留程序。
作为备份计划,我们将使用闪电网络钱包向自己付款。转到htlc.me(https://htlc.me/)并生成钱包,然后单击“receive接收”标签,请求支付0.0001 tBTC($0.65 tUSD)。复制序列化的凭证并且在发送之前进行核实。
$ lightning-cli decodepay lntb100u1pdvzzc4pp5h55942ehdpy5g70sty9mnvt3k2wlvt4ucnctnellau8drhaew8lsdqqcqzyswv3n3vyzx9uua4tjl8ttcp5fp7srn80zywvg4vses6fj4q9n3v846mgkuu648u37venf93znkckadjejvddv04vyq5l2krx486z23ysqhcrxg6
{
"currency": "tb",
"timestamp": 1522600725,
"created_at": 1522600725,
"expiry": 3600,
"payee": "03193d512b010997885b232ecd6b300917e5288de8785d6d9f619a8952728c78e8",
"msatoshi": 10000000,
"description": "",
"min_final_cltv_expiry": 144,
"payment_hash": "bd285aab3768494479f0590bb9b171b29df62ebcc4f0b9e7ffef0ed1dfb971ff",
"signature": "30440220732338b0823179ced572f9d6bc06890fa0399de223988ab21986932a80b38b0f02205d6d16e73553f23e666692c453b62dd6cb32635ac7d584053eab0cd53e84a892"
}
这次,当我试着付款的时候,收到了多个错误。
$ lightning-cli pay lntb100u1pdvzzc4pp5h55942ehdpy5g70sty9mnvt3k2wlvt4ucnctnellau8drhaew8lsdqqcqzyswv3n3vyzx9uua4tjl8ttcp5fp7srn80zywvg4vses6fj4q9n3v846mgkuu648u37venf93znkckadjejvddv04vyq5l2krx486z23ysqhcrxg6
{
"failures": [{
"type": "FAIL_PAYMENT_REPLY",
"erring_index": 1,
"failcode": 4103...
然而,当我刷新htlc.me网页时,我发现付款实际上已经成功了。在控制台检查确认已付款。
$ lightning-cli listpayments
{
"payments": [{
"id": 1,
"payment_hash": "bd285aab3768494479f0590bb9b171b29df62ebcc4f0b9e7ffef0ed1dfb971ff",
"destination": "03193d512b010997885b232ecd6b300917e5288de8785d6d9f619a8952728c78e8",
"msatoshi": 10000000,
"msatoshi_sent": 10002020,
"timestamp": 1522601027,
"created_at": 1522601027,
"status": "complete",
"payment_preimage": "3e75637befbeec9e7056a4103a06d652cd3cdee9134de69799d8b39c6b1f714c"
}]
}
我们这次付款只付了2020 millisatoshi(比特币的计量单位)的交易费用(在写本文时是0.00013美元)。
最后,我们尝试直接连接到htlc.me。这样我们在付款的时候就不会出现任何控制台错误。从上面的解码付款命令输出中复制付款人ID,并在闪电网络浏览器中进行搜索。复制URI,然后连接并创建一个通道。
$ lightning-cli connect 03193d512b010997885b232ecd6b300917e5288de8785d6d9f619a8952728c78e8 34.201.11.250 9735
$ lightning-cli fundchannel 03193d512b010997885b232ecd6b300917e5288de8785d6d9f619a8952728c78e8 500000
但我们需要等待交易在区块链上确认,通道才可用。
一个小时后,我们可以看到通道已经建立——状态显示CHANNELD_NORMAL。
$ lightning-cli listpeers
{
"id": "03193d512b010997885b232ecd6b300917e5288de8785d6d9f619a8952728c78e8",
"connected": true,
"netaddr": ["34.201.11.250:9735"],
"alias": "htlc.me",
"color": "854cc5",
"channels": [{
"state": "CHANNELD_NORMAL",
"owner": "lightning_channeld",
"short_channel_id": "1289949:56:0",
"channel_id": "20dd321c23224b2022f62f59602efc311a8ad63c4481fcd210ef8dade88e8064",
"funding_txid": "64808ee8ad8def10d2fc81443cd68a1a31fc2e60592ff622204b22231c32dd20",
"msatoshi_to_us": 500000000,
"msatoshi_total": 500000000,
"dust_limit_satoshis": 546,
"max_htlc_value_in_flight_msat": 18446744073709552000,
"channel_reserve_satoshis": 0,
"htlc_minimum_msat": 0,
"their_to_self_delay": 6,
"our_to_self_delay": 144,
"to_self_delay": 6,
"max_accepted_htlcs": 483,
"status": ["CHANNELD_NORMAL:Funding transaction locked."],
"in_payments_offered": 0,
"in_msatoshi_offered": 0,
"in_payments_fulfilled": 0,
"in_msatoshi_fulfilled": 0,
"out_payments_offered": 0,
"out_msatoshi_offered": 0,
"out_payments_fulfilled": 0,
"out_msatoshi_fulfilled": 0
}]
}
这时在htlc.me上生成另一张凭证,这次是0.00020000 tBTC ($1.31 tUSD),并且记得在付款前检查详细信息是否正确。
$ lightning-cli decodepay lntb200u1pdvzvf8pp5tyjfw9ma9uj8hhrhqvmum9vzvaun45qg6mmesu3c08zkhmgl44ssdqqcqzysah4qe4zef3rssusa42cyx0gxxq6q06g50m38w7chz50en80dfh45fj7kdgpx474udehq22mv2pwxfky66kdjdrw88z34w8hjjdjdu6sq6zy2a4
最后付款。
$ lightning-cli pay lntb200u1pdvzvf8pp5tyjfw9ma9uj8hhrhqvmum9vzvaun45qg6mmesu3c08zkhmgl44ssdqqcqzysah4qe4zef3rssusa42cyx0gxxq6q06g50m38w7chz50en80dfh45fj7kdgpx474udehq22mv2pwxfky66kdjdrw88z34w8hjjdjdu6sq6zy2a4
{
"id": 2,
"payment_hash": "592497177d2f247bdc770337cd958267793ad008d6f798723879c56bed1fad61",
"destination": "03193d512b010997885b232ecd6b300917e5288de8785d6d9f619a8952728c78e8",
"msatoshi": 20000000,
"msatoshi_sent": 20000000,
"timestamp": 1522610489,
"created_at": 1522610489,
"status": "complete",
"payment_preimage": "1e2767675a227c7f8d57252bfe67d6324829c267f3df38396b4d2bb79a27dfd6",
"getroute_tries": 1,
"sendpay_tries": 1,
"route": [{
"id": "03193d512b010997885b232ecd6b300917e5288de8785d6d9f619a8952728c78e8",
"channel": "1289949:56:0",
"msatoshi": 20000000,
"delay": 144
}],
"failures": []
}
这次没有出现任何控制台错误。你在htlc.me的网络钱包应该会立即检测到已付款。现在,你应该可以以十分低廉的费用进行任意金额的付款了,直到你耗尽通道中的资金,或该笔款项到期为止。
总结
如你所见,测试网上的节点至少还能用。三个主要的闪电软件实现(lnd, c-lightning, eclair)仍都处于开发的早期阶段,因此有一些错误也不足为奇。但这至少能让你了解:将来,随着网络的不断扩大以及运行它的软件不断成熟完善,交易也将会变的更加便宜又快速。
现在报名,立享200元优惠,赶紧报名吧!👇 👇 👇
想做好区块链数据分析?先来看看如何解决“去匿名化”这个大难题!| 博文精选 把700元的单片机改造成以太坊节点, 9步get起新技能! 无需标注数据,利用辅助性旋转损失的自监督GANs,效果堪比现有最好方法 985 高校计算机系学生都在用的笔记本,我被深深地种草了! 从拨号到 5G :互联网登录完全指南